package com.kaifamiao.strings;

/**
 * 1、针对字符串使用 + 运算符实现所谓的字符串连接，本质上都是语法糖
 * 
 * 		如果是两个 字符串字面量 连接，则在编译时就将其合并成一个完整的字符串字面量
 * 		比如 "云创动力" + "kaifamiao" 在编译之后就是 "云创动力kaifamiao"
 * 
 *		如果是 字符串字面量 和 字符串变量 连接 或者是 两个字符串变量 链接，则会转换成 字符缓冲区 操作
 *		比如 String p = x + s 在编译后就是(在 Java 9 之前):
 *		StringBuilder builder = new StringBuilder();
 *		builder.append( x );
 *		builder.append( s );
 *		String q = builder.toString(); 
 *		但从 Java 9 开始不再采用以上操作步骤，而是使用 makeConcatWithConstants 实现字符串变量的连接
 *
 * 2、连接字符串时，凡是使用了 字符串变量 的 都会产生新的 String实例
 */
public class StringTest7 {

	public static void main(String[] args) {
		
		String x = "云创动力" ;
		String s = "kaifamiao" ;
		
		String t = "云创动力" + "kaifamiao" ;
		System.out.println( t );
		
		String p = x + s ; // new String( ... )
		System.out.println( p );
		
		System.out.println( t == p ); // false
		System.out.println( System.identityHashCode( t ) );
		System.out.println( System.identityHashCode( p ) );
		
		// 在 Java 9 之前采用类似以下操作过程来连接String变量
		StringBuilder builder = new StringBuilder();
		builder.append( x );
		builder.append( s );
		String q = builder.toString(); // new String( ... )
		System.out.println( q == p ); // false
		System.out.println( q == t ); // false
	}

}
